# -*- coding: utf-8 -*-
# -文件说明：类 和部分标准库-
# @Time    : 2019/7/10 15:05
# @Author  : hwx
# @Email   : @163.com
# @File    : 官方教程9.py
# @Software: PyCharm
import random
from urllib.request import urlopen


def fun1():
    """
作用域和命名空间示例:局部 赋值（这是默认状态）不会改变 scope_test 对 spam 的绑定。 nonlocal 赋值会改变 scope_test
对 spam 的绑定，而 global 赋值会改变模块层级的绑定。您还可以在 global 赋值之前看到之前没有 spam 的绑定。
    """
    def do_local():
        spam = "local spam"

    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal spam"

    def do_global():
        global spam
        spam = "global spam"

    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)


# fun1()
# print("In global scope:", spam)


def fun2():
    """
当一个类定义了 __init__() 方法时，类的实例化操作会自动为新创建的类实例发起调用 __init__(),当然，__init__()
方法还可以有额外参数以实现更高灵活性。 在这种情况下，提供给类实例化运算符的参数将被传递给 __init__()。
    """
    class ClassDemo1:
        def __init__(self, rea, bea):
            self.r = rea
            self.b = bea
    x = ClassDemo1(2, 3)
    print(x.r, x.b)     # 输出2,3


# fun2()


def fun3():
    """
 1.迭代器:迭代器的使用非常普遍并使得 Python 成为一个统一的整体。 在幕后，for 语句会调用容器对象中的 iter()。
 该函数返回一个定义了 __next__() 方法的迭代器对象，该方法将逐一访问容器中的元素。 当元素用尽时，__next__() 将
 引发 StopIteration 异常来通知终止 for 循环。 你可以使用 next() 内置函数来调用 __next__() 方法；

    """
    # 1
    s = 'abcd'
    it = iter(s)
    print(it)
    print(next(it))
    print(next(it))
    print(next(it))
    print(next(it))
    # print(next(it))
# 2


# fun3()
def fun4():
    """
2.自定义一个迭代器看过迭代器协议的幕后机制，给你的类添加迭代器行为就很容易了。 定义一个 __iter__() 方法来返回一个
 带有 __next__() 方法的对象。 如果类已定义了 __next__()，则 __iter__() 可以简单地返回 self:
    :return:
    """
    class Reverse:
        """
        循环迭代器
        """

        def __init__(self, data):       # 至init不是int
            self.data = data
            self.index = len(data)

        def __iter__(self):
            return self

        def __next__(self):
            if self.index == 0:
                raise StopIteration
            self.index = self.index - 1
            return self.data[self.index]
    demodata = Reverse('abidf')
    for i in demodata:
        print(i)


# fun4()


def fun5():
    """
Generator 是一个用于创建迭代器的简单而强大的工具。 它们的写法类似标准的函数，但当它们要返回数据时会使用 yield 语句。
 每次对生成器调用 next() 时，它会从上次离开位置恢复执行（它会记住上次执行语句时的所有数据值）。
    """
    def rev(data):
        for index in range(len(data) - 1, -1, -1):
            yield data[index]
    for char in rev('123214'):
        print(char)


# print(fun5())


def fun6():
    """
1.random 模块提供了进行随机选择的工具:
2.os 模块提供了许多与操作系统交互的函数:
3.互联网访问urllib.request
    """
    # 1
    print(random.choice(['apple', 'pear', 'banana']))
    print(random.sample(range(100), 10))
    # 2
    # 3
    with urlopen('http://www.dili360.com') as resp:
        for line in resp:
            line = line.decode('utf-8')
            if '地理' in line or '图' in line:
                print(line)
fun6()

def fun7():
    """
1.性能测量from timeit import Timer
2.质量控制import doctest
3.日期和时间from datetime import date
4.输出模块reprlib 模块提供了一个定制化版本的 repr() 函数，用于缩略显示大型或深层嵌套的容器对象:
textwrap 模块能够格式化文本段落，以适应给定的屏幕宽度:
locale 模块处理与特定地域文化相关的数据格式。locale 模块的 format 函数包含一个 grouping 属性，可直接将数字格式化为带有
组分隔符的样式
5.使用二进制数据记录格式
6.多线程
7.多线程
    """
